
----------------------------------------------------------------
--- Copyright：  迷你玩-海马
--- Description：单节点管理服务器
----------------------------------------------------------------

---- 在openresty的节点上，部署这个服务，可以实现下面功能：
-------- 使用root用户执行，可以执行指定的shell脚本和命令
-------- 1 可以在收到通知后，自动同步本节点上的lua代码
-------- 2 可以重新reload本机器上的openresty服务器

-------- 3 目前的应用：接受租赁服rent_server的控制，用来管理云租赁服的node_server和云服进程gs

----------------------------------------------------------------



local require = require;
local ngx     = ngx;
local pairs   = pairs;
local string  = string;
local collectgarbage = collectgarbage;
local table = table;
local io = io;
local assert = assert;
local tonumber = tonumber;

local log          = require("modules.commhm.log")
local ns_time      = require("modules.commhm.time")
local uu           = require("modules.commhm.utils")
local ns_env       = require("modules.env.env")

local ns_auth_comm_checker    = require("modules.commhm.auth_comm_checker");
local gg                      = require("modules.keeper_server.keeper_gg")

local ns_rent_node_command    =  require("modules.keeper_server.rent_node_command")
local ns_keeper_node_command  =  require("modules.keeper_server.keeper_node_command")
local ns_luaConfigMgr         =  require("modules.center_server.luaConfigProxy")

local FOO = {
	_VERSION = '0.12.1',
	acts = {},
	cmds = {},
};


FOO.read_no_auth_acts = {
}


function FOO.enter()

	ngx.ctx.m_params = ngx.req.get_uri_args();

	if  ngx.ctx.m_params.cmd then
		--log.debug( "----enter---- cmd=" .. ngx.ctx.m_params.cmd );
		local func_ = FOO.cmds[ ngx.ctx.m_params.cmd ];
		if  func_ then
			if  FOO.read_no_auth_acts[ ngx.ctx.m_params.cmd ] == 1 then
				if  not ns_auth_comm_checker.check_uin_safe( ngx.ctx.m_params.uin ) then
					return
				end
			else
				if  ns_auth_comm_checker.check_cmd_auth_no_exit() ~= 0 then
					return
				end
			end

			--gg.init();
			func_();
			--gg.final();

		else
			log.debug( "unknown cmd=" .. ngx.ctx.m_params.cmd );
		end

	elseif ngx.ctx.m_params.act then
		log.debug( "act error" );
	else
		log.debug( "no act or cmd need to do" );
	end

end


------------------定时器 拉取配置文件---------------

function FOO.init_worker_by_lua_file()
	log.day_list_simple( "keeper_server", "init_worker_by_lua_file", ngx.worker.id(), gg.hostname, gg.keeper_ver )

	---启动心跳上报定时器 5分钟上报一次
	ns_luaConfigMgr.register_config_file_change( "servers_update", ngx.worker.id()+300,
			FOO.callback_servers_update, "keeper_server" )
end


function FOO.callback_servers_update( ret_ )
	log.day_list_simple( "keeper_server", "callback_servers_update", uu.to_str(ret_) )
end



----构造函数
function FOO.init()
	log.day_list( "keeper_server", "init", ngx.worker.id(), gg.hostname, gg.keeper_ver )
end


----重新 reload 自己
function FOO.cmds.reload_keeper()
	local cmd_ = "cd /usr/local/openresty/nginx/; /usr/local/openresty/nginx/keeper_nginx_reload.sh;"
	local msg_ = uu.os_exec( cmd_ )
	gg.return_table( { ret=0, msg=msg_ } )
end


----主控检查keeper的存活
function FOO.cmds.check_alive()
	local fret_ = { now=uu.now(), env=ns_env.debug, hostname=gg.hostname, keeper_ver=gg.keeper_ver };
	gg.return_table( fret_ )
end


----执行指定的脚本 lua/modules/keeper_server/sh/ 目录下
function FOO.cmds.post_event()
	if  ngx.ctx.m_params.event == 'sh' then
		-- 加强安全性，所有脚本包在lua文件里
		local lua_file_name_ = './lua/modules/keeper_server/sh/' .. ngx.ctx.m_params.event_name .. '.lua'
		if  uu.file_exist( lua_file_name_ ) then

			local shell_lua_ = require( "lua.modules.keeper_server.sh." .. ngx.ctx.m_params.event_name )
			if  shell_lua_ and shell_lua_.content and shell_lua_.shell_ver then
				if  ngx.ctx.m_params.shell_ver == shell_lua_.shell_ver then
					local shell_name_ = './lua/modules/keeper_server/sh/' .. ngx.ctx.m_params.event_name .. '.sh'
					uu.write_file_content( shell_name_, shell_lua_.content, 1 )

					local ret_string1_ = uu.os_exec_async( 'chmod 700 ' .. shell_name_ )
					log.debug( 'ret_string1_=' .. ret_string1_ )

					local ext_ = ''    --只能是数字，保持安全性(一旦有文字传入就会有安全隐患)
					if  ngx.ctx.m_params.ext then
						ext_ = tonumber( ngx.ctx.m_params.ext ) or 0
					end

					local ret_string2_ = uu.os_exec_async( shell_name_ .. ' ' .. ext_ )
					log.debug( 'ret_string2_=' .. ret_string2_ )
					gg.return_table( { ret=0, msg=ret_string2_ } )
				else
					gg.return_table( { ret=2, msg='error_ver_not_match' } )
				end
			else
				gg.return_table( { ret=2, msg='error_content_or_ver' } )
			end
		else
			gg.return_table( { ret=1, msg='error_file_not_exist' } )
		end
	end
end


---------------------------------------------------------------
------作为 [云租赁服节点] 的管理命令
function FOO.cmds.rent_node_command()
    ns_rent_node_command.do_command()
end


------作为 [通用服务器节点] 的管理命令
function FOO.cmds.keeper_node_command()
    ns_keeper_node_command.do_command()
end



FOO.init()
return FOO;
